$(function() {
	
	/**
	 * Configuração do ajax.
	 * Quando começar uma requisição ajax, mostra o 'loading'.
	 * Quando terminar a requisição ajax, some o 'loading'.
	 */
	$.ajaxSetup({
	    beforeSend: function(xhr, status) {
	    	xhr.setRequestHeader("Ajax", "ajax");
	    	$('.load').show();
		},
	    complete: function() {
	    	$('.load').hide();
	    }
	});
	
	
	/**
	 * BOOTSTRAP-MENU 2.3.2
	 * Configuração para fechar menu bootstrap ao clicar.
	 */
	$(".dropdown-menu a").click(function() {
	    $(this).closest(".dropdown-menu").prev().dropdown("toggle");
	});
	
	
	/** 
	 * Faz requisição em ajax para a url que está na propriedade "href" do link <a> correspondente.
	 * Os componentes com os 'names', 'ids' e 'types' especificados nas regras abaixo não entram nesse tipo de requisição.
	 */
	$("body").on("click", "a[name!=skipAjax][name!=modal][name!=linkModalDefault], " +
			"button[name!=skipAjax][id!=skipAjax][type!=submit], " +
			"input[name!=skipAjax][id!=skipAjax][type!=submit]", 
			
		function(){
			$('#content').load($(this).attr('href'));
			$('#content').scrollTop();
			
			return false;
    	}
	);
	
	
	/**
	 * Retorna o "id" do <form> pai (mais próximo) do elemento correspondente
	 */
	function parentForm(bt) {
		return $(bt).closest('.form').attr('id');
	}
	
	
	/**
	 * Faz requisição do tipo POST
	 * ao alterar o valor de um elemento <select> com propriedade "id=filter"
	 * de acordo com a 'action' do <form> com propriedade "id=defaultForm"
	 */
	$("body").on("change", "select[id=filter]", function() {
		
		var idForm = parentForm(this);
		var form = jQuery('#' + idForm);
		var parametros = form.serialize();
		
		// Adicionar o valor do botão como parâmetro do Request.
		parametros += "&form=" + idForm;
		
		jQuery.ajax({type: form.attr('method'),
		    dataType: 'html',
		    data: parametros,
		    url: form.attr('action'),
		    success: function(html) {
		    	if (idForm == 'modalForm') {
		    		$('#modal-fields').html(html);
		    	} else {
		    		$('#content').html(html);
		    		$('#content').scrollTop();
		    	}
		    },
		    error: function(){
		    	$('.load').hide();
		    	alert('Erro na aplicação. Favor reportar.');
		    }
		 });

		return false;
    });
	
	
	/**
	 * Faz requisição do tipo GET com o servidor
	 * ao digitar no campo texto de um elemento <input> com propriedade "name=filter"
	 * de acordo com a action do <form> com propriedade "id=defaultForm"
	 */
	$("body").on("keyup", "input[name=filter]", function() {
		
		var idForm = parentForm(this);
		var form = jQuery('#' + idForm);
		var parametros = form.serialize();
		
		jQuery.ajax({type: form.attr('method'),
		    dataType: 'html',
		    data: parametros,
		    url: form.attr('action'),
		    success: function(html) {
	    		$('#well-content').html(html);
	    		$('#well-content').scrollTop();
		    },
		    error: function(){
		    	$('.load').hide();
		    	alert('Erro na aplicação. Favor reportar.');
		    }
		});
		
		return false;
    });
	
	
	/**
	 * Toda vez que um botão for clicado, deverá fazer uma requisição ajax para validar o objeto
	 * que esta preenchido nos campos do formulário. Se o objeto passar pelo Bean Validation, 
	 * é feito uma nova requisição para o Controller vinculado ao <form>
	 * e o conteúdo retornado do servidor, deve ser jogado na <div> com propriedade "id=content".
	 */
	$("body").on("click", "input[name=submit], button[name=submit][id!=skipAjax]", function() {
		var idForm = parentForm(this);
		var form = jQuery('#' + idForm);
		var parametros = form.serialize();
		
		// Adcionar o valor do botão como parâmetro do Request.
		parametros += "&form=" + idForm;
		parametros += "&submit=" + $(this).closest('#submit').attr('value');
		
		var pathname = window.location.pathname;
		var validationUrl = pathname + 'validation/' + form.attr('action').substring(pathname.length);
		validationUrl = validationUrl.replace("/edit", "");
		
		jQuery('.autocomplete-suggestions').hide();
		
		jQuery.ajax({type: form.attr('method'),
			 dataType: 'json',
			 url: validationUrl,
			 data: parametros,
			 success: function(json){
				 var alerta = "";
				 
				 jQuery.each(json, function(i, erros) {
				     for(var i=0 ; i<erros.length ; i++) {
				    	 alerta += "<p class='error'>";
				         alerta += erros[i] + '</p>';
					 }
				 });
				 
				 jQuery('#errors').html(alerta);
				 jQuery('#errors').show();
				 jQuery('#errors').click(function(){
				     jQuery(this).hide();
				 });
				 jQuery('#content').scrollTop();
			 },
			 error: function(XMLHttpRequest, textStatus, errorThrown) {
				 jQuery.ajax({type: form.attr('method'),
					dataType: 'html',
					data: parametros,
					url: form.attr('action'),
					success: function(html) {
						$('#content').html(html);
						$('#content').scrollTop();
					},
					error: function(){
						$('.load').hide();
						alert('Erro na aplicação. Favor reportar.');
					}
				 });
			 }
		});
		
		return false;
    });
	
	
	/**
	 * Abrir conteúdo dentro de modal.
	 */
	$("body").on("click", "a[name=modal]", function() {
		var form = jQuery('#' + parentForm());
		
		jQuery.ajax({
            type: form.method,
            url: $(this).attr('href'),
            dataType: 'text',
            cache: 'false',
            success: function(data){
            	jQuery('#modal-fields').html(data);
                jQuery('#modal').modal('show');
            }
        });
		
		return false;
	});
	
	
	/**
	 * Abrir conteúdo dentro de modal.
	 */
	$("body").on("click", "a[name=linkModalDefault]", function() {
		var form = jQuery('#' + parentForm());
		
		jQuery.ajax({
            type: form.method,
            url: $(this).attr('href'),
            dataType: 'text',
            cache: 'false',
            success: function(data){
            	jQuery('#modalDefault').html(data);
                jQuery('#modalDefault').modal('show');
            }
        });
		
		return false;
	});

	
	/**
	 * Abrir conteúdo dentro de modal.
	 */
	$("body").on("click", "a[name=modalStart]", function() {
		
		jQuery.ajax({
            type: 'GET',
            url: $(this).attr('href'),
            dataType: 'text',
            cache: 'false',
            success: function(data){
            	jQuery('#modal-start-fields').html(data);
                jQuery('#iniciarModal').modal('show');
            }
        });
		
		return false;
	});
	
	
	/**
	 * 
	 */
	$("body").on("click", "input[name=marcarConsulta], button[id=marcarConsulta]", function() {
		var form = jQuery('#consultaForm');
		var parametros = form.serialize();
		var pathname = window.location.pathname;
		var validationUrl = pathname + 'validation/' + form.attr('action').substring(pathname.length);
		validationUrl = validationUrl.replace("/edit", "");
		
		jQuery('.autocomplete-suggestions').hide();
		
		jQuery.ajax({type: 'POST',
			 dataType: 'json',
			 url: validationUrl,
			 data: parametros,
			 success: function(json){
				 var alerta = "";
				 
				 jQuery.each(json, function(i, erros) {
				     for(var i=0 ; i<erros.length ; i++) {
				    	 alerta += "<p class='error'>";
				         alerta += erros[i] + '</p>';
					 }
				 });
				 
				 jQuery('#errors').html(alerta);
				 jQuery('#errors').show();
				 jQuery('#errors').click(function(){
				     jQuery(this).hide();
				 });
				 
				 jQuery('#content').scrollTop();
			 },
			 error: function(XMLHttpRequest, textStatus, errorThrown) {
				 jQuery.ajax({type: 'GET',
				    dataType: 'html',
				    data: parametros,
				    url: form.attr('action'),
				    success: function(html) {
			    		$('#content').html(html);
			    		$('#content').scrollTop();
				    },
				    error: function(){
				    	$('.load').hide();
				    	alert('Erro na aplicação. Favor reportar.');
				    }
				 });
			 }
		});

		return false;
    });
	
});